# TODO 字典的使用
# 字典是Python中一种非常有用的数据结构，它允许你存储和组织键值对（key-value pairs）的集合。
# 字典是可变的、无序的（从Python3.6版本之后，字典编程有序了，字典的顺序是元素添加的顺序），并且可以包含任意类型的对象作为值。你可以通过键来快速访问和检索值，而无需遍历整个字典。
# 字典的键必须是不可变的数据类型，比如整数、浮点数、字符串、元组等，不能使用可变的数据类型，如列表、字典或者集合作为键。

# 创建字典：你可以使用花括号 {} 或者 dict() 函数来创建一个新的空字典。
my_dict = {}  # 使用花括号创建空字典
my_dict = dict()  # 使用 dict 函数创建空字典

# 向字典中添加元素：你可以直接使用键值对语法向字典中添加元素。
my_dict = {}
my_dict["key1"] = "value1"  # 添加元素
my_dict["key2"] = "value2"  # 添加元素
my_dict["key3"] = "value3"  # 添加元素
my_dict["key4"] = "value4"  # 添加元素

print("删除key")
# 删除字典中的元素：你可以使用 del 关键字或者 pop() 方法删除字典中的元素。
# 注意，如果使用 del 关键字删除一个不存在的键，Python 会抛出 KeyError 异常。如果你不确定一个键是否存在，可以使用 pop() 方法，这个方法在键不存在时会返回 None 或者指定的默认值。
del my_dict["key1"]  # 删除元素，如果键不存在会抛出 KeyError
for key, value in my_dict.items():
    print(f"Key: {key}, Value: {value}")  # Key: key2, Value: value2

value1 = my_dict.pop("key1", None)  # 删除元素并返回其值，如果键不存在返回 None
for key, value in my_dict.items():
    print(f"Key: {key}, Value: {value}")

value1 = my_dict.pop("key1", "default_value")  # 删除元素并返回其值，如果键不存在返回 "default_value"
print(value1)  # default_value

# 修改字典中的值
print("修改字典中的值")
my_dict['key2'] = 'new value'  # 将key2对应的值修改为'new value'
print(my_dict['key2'])  # 输出：new value

print("查看当前字典中的某个值")
# 获取字典中的元素：你可以使用键名直接从字典中获取元素，或者使用 get() 方法。注意，如果使用键名直接获取元素，而这个键名不存在于字典中，Python 会抛出 KeyError 异常。
# 如果你不确定一个键是否存在，可以使用 get() 方法，这个方法在键不存在时会返回 None 或者指定的默认值。
value1 = my_dict["key2"]  # 获取元素，如果键不存在会抛出 KeyError
print(value1)  # new value
value1 = my_dict.get("key12")  # 获取元素，如果键不存在返回 None
print(value1)  # None
value1 = my_dict.get("key111", "default_value")  # 获取元素，如果键不存在返回 "default_value"
print(value1)  # default_value

print("遍历字典")
# 遍历字典：你可以使用 for 循环和 items() 方法遍历字典中的键值对。
for key, value in my_dict.items():
    print(f"Key: {key}, Value: {value}")
# Key: key2, Value: new value
# Key: key3, Value: value3
# Key: key4, Value: value4

# 字典中的常用方法
# 获取所有的键
keys = my_dict.keys()
print(keys)  # dict_keys(['key2', 'key3', 'key4'])

# 获取所有的值
values = my_dict.values()
print(values)  # dict_values(['new value', 'value3', 'value4'])

# 检查字典中是否存在指定的键
contains_key = 'key1' in my_dict
print(contains_key)  # False
# 获取字典中键值对的数量
size = len(my_dict)
print(size)  # 3
# 清空字典
my_dict.clear()

# TODO 字典的解析
# 字典解析与列表解析类似，但是用于创建新的字典。可以根据现有字典或其他可迭代对象进行过滤、转换和筛选。
# 创建一个包含数字和其平方的字典
numbers = [1, 2, 3, 4, 5]
squares = {x: x ** 2 for x in numbers}
print(squares)  # 输出: {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

# 过滤出偶数的平方
evens = {x: x ** 2 for x in numbers if x % 2 == 0}
print(evens)  # 输出: {2: 4, 4: 16}

print(evens.get(2, "key不存在"))  # 4
print(evens.get(12, "key不存在"))  # key不存在
